// 某种外星语也使用英文小写字母，但可能顺序 order 不同。字母表的顺序（order）是一些小写字母的排列。

// 给定一组用外星语书写的单词 words，以及其字母表的顺序 order，只有当给定的单词在这种外星语中按字典序排列时，返回 true；否则，返回 false。

//  

// 示例 1：

// 输入：words = ["hello","leetcode"], order = "hlabcdefgijkmnopqrstuvwxyz"
// 输出：true
// 解释：在该语言的字母表中，'h' 位于 'l' 之前，所以单词序列是按字典序排列的。
// 示例 2：

// 输入：words = ["word","world","row"], order = "worldabcefghijkmnpqstuvxyz"
// 输出：false
// 解释：在该语言的字母表中，'d' 位于 'l' 之后，那么 words[0] > words[1]，因此单词序列不是按字典序排列的。
// 示例 3：

// 输入：words = ["apple","app"], order = "abcdefghijklmnopqrstuvwxyz"
// 输出：false
// 解释：当前三个字符 "app" 匹配时，第二个字符串相对短一些，然后根据词典编纂规则 "apple" > "app"，因为 'l' > '∅'，其中 '∅' 是空白字符，定义为比任何其他字符都小（更多信息）。
//  

// 提示：

// 1 <= words.length <= 100
// 1 <= words[i].length <= 20
// order.length == 26
// 在 words[i] 和 order 中的所有字符都是英文小写字母。

#include <vector>
#include <string>
#include <map>

using namespace std;

class Solution {
public:
    bool isAlienSorted(vector<string>& words, string order) {
        map<char, int> mp{};
        for (int i{0}; i < order.size(); ++i) {
            mp[order[i]] = i;
        }
        for (int i{0}; i < words.size()-1; ++i) {
            if (!cmp(words[i], words[i+1], mp)) {
                return false;
            }
        }
        return true;
    }
    // 按mp字典顺序，s1 < s2返回true
    bool cmp(string s1, string s2, map<char, int>& mp) {
        int len = min(s1.size(), s2.size());
        for(int i{0}; i < len; ++i) {
            if(s1[i] != s2[i]) {
                return mp[s1[i]] < mp[s2[i]];
            }
        }
        return s1.size()<s2.size();
    }
};

#include "../stdc++.h"

class Solution {
public:
    bool isAlienSorted(vector<string>& words, string order) {
        unordered_map<char, int> dict;
        int n = order.size();
        for (int i = 0; i < n; ++i) {
            dict[order[i]] = i;
        }
        auto isSorted = [&dict] (const string& s1, const string& s2) {
            int len = min(s1.size(), s2.size());
            for (int i = 0; i < len; ++i) {
                if (s1[i] != s2[i]) {
                    return dict[s1[i]] < dict[s2[i]];
                }
            }
            return s1.size() <= s2.size();
        };
        n = words.size();
        for (int i = 1; i < n; ++i) {
            if (!isSorted(words[i - 1], words[i])) {
                return false;
            }
        }
        return true;
    }
};
